#include <bits/stdc++.h>
using namespace std;

using ll = long long;

// 定义节点结构体
struct Node {
  ll x, h; // x 表示横坐标，h 表示高度
  int type; // type 表示边界类型，0 为左边界，1 为右边界
  bool operator<(const Node &o) const { return x < o.x; }
} a[600005];

int main() {
  int n;
  cin >> n; // 输入矩形的数量

  // 输入每个矩形的左边界、右边界和高度
  for (int i = 1; i <= n; ++i) {
    int s, t, h;
    cin >> s >> t >> h;
    a[i * 2 - 1] = {s, h, 0}; // 0 表示左边界
    a[i * 2] = {t, h, 1};     // 1 表示右边界
  }

  int n2 = n * 2; // 计算节点总数
  std::sort(a + 1, a + n2 + 1); // 按 x 坐标排序

  ll ans = 0; // 存储总面积
  ll last = 0; // 扫描线上一次扫过的矩形高度的位置
  multiset<ll> st; // 维护当前存活的矩形高度
  st.insert(0); // 初始化高度为 0

  // 扫描线算法
  int i = 1; 
  while (i <= n2) {
    ll x = a[i].x; // 当前 x 坐标
    ans += *st.rbegin() * (a[i].x - last); // 计算当前高度与上一个 x 的面积
    last = a[i].x; // 更新上一个 x 坐标

    // 处理当前 x 坐标的所有节点
    while (i <= n2 && a[i].x == last) {
      if (a[i].type) // 如果是右边界
        st.erase(st.find(a[i].h)); // 移除高度
      else // 如果是左边界
        st.insert(a[i].h); // 添加高度
      ++i; // 移动到下一个节点
    }
  }

  cout << ans << '\n'; // 输出总面积

  return 0;
}